﻿namespace PropOnline.Helpers
{
    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Linq;
    using PropOnline.Models;
    using PropOnline.ViewModels.Propiedad;

    public class PropiedadHelper
    {
        public static Moneda GetMonedaForOperacion(Operacion? operacion)
        {
            if (operacion == Operacion.Venta)
            {
                return PropOnlineConstants.MonedaParaVentas;
            }
            else if (operacion == Operacion.Alquiler)            
            {
                return PropOnlineConstants.MonedaParaAlquileres;
            }

            return Moneda.NoEspecifica;
        }

        public static string ObtenerTiempoEnMercado(DateTime fechaUltimaPub)
        {
            var diferencia = DateTime.Now - fechaUltimaPub;

            if (diferencia.Days > 365)
            {
                var anios = Convert.ToInt32(diferencia.Days / 365);
                return string.Format(CultureInfo.CurrentCulture, "{0} {1}", anios, anios == 1 ? " año" : "años");
            }

            if (diferencia.Days > 30)
            {
                var meses = Convert.ToInt32(diferencia.Days / 30);
                return string.Format(CultureInfo.CurrentCulture, "{0} {1}", meses, meses == 1 ? " mes" : "meses");
            }

            return diferencia.Days + " dias";
        }

        public static string FormatTelefono(uint? telefono)
        {
            if (telefono > 0)
            {
                if (telefono.ToString().Length == 8)
                {
                    return string.Format(CultureInfo.CurrentCulture, "Tel. {0:####-####}", telefono);
                }
                else if (telefono.ToString().Length == 10)
                {
                    return string.Format(CultureInfo.CurrentCulture, "Tel. {0:##-####-####}", telefono);
                }
                else
                {
                    return "Tel. " + telefono.ToString();
                }
            }

            return string.Empty;
        }

        public static int ObtenerPrecioPorMetroCuadradoPromedio(IEnumerable<PropiedadResultadoViewModel> propiedades)
        {
            var propiedadesByPrecio = propiedades.Where(p => p.Precio > 0).OrderBy(p => p.Precio);
            var cantidadPropiedadesByPrecio = propiedadesByPrecio.Count();
            
            if (cantidadPropiedadesByPrecio == 0)
            {
                return 0;
            }

            var media = propiedadesByPrecio.ElementAt(cantidadPropiedadesByPrecio / 2).Precio;            

            var limiteInferior = (uint)media * PropOnlineConstants.ExclusionPromedioInferior;
            var limiteSuperior = (uint)media * PropOnlineConstants.ExclusionPromedioSuperior;
            
            var sumPrecioPorMetroCuadrado = 0;
            var count = 0;                        

            foreach (var propiedad in propiedadesByPrecio)
            {                
                if (propiedad.Precio < limiteSuperior && propiedad.Precio > limiteInferior && propiedad.Superficie > 0)
                {
                    count++;
                    sumPrecioPorMetroCuadrado += (int)propiedad.Precio / propiedad.Superficie.Value;
                }                               
            }

            var precioPorMetroCuadradoPromedio = 0;
            try
            {
                precioPorMetroCuadradoPromedio = sumPrecioPorMetroCuadrado / count;
            }
            catch 
            {
                return 0;
            }

            return precioPorMetroCuadradoPromedio;
        }  
    }
}